"""
LeetCode 热题

给你一个整数数组 nums，有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。
"""

from collections import deque

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        返回滑动窗口中的最大值。

        参数:
        nums: List[int]，整数数组。
        k: int，滑动窗口的大小。

        返回:
        List[int]，每个滑动窗口中的最大值。
        """
        if not nums:
            return []

        # 用于存储当前窗口内的元素索引，并保持递减顺序
        window = deque()
        result = []

        for i in range(len(nums)):
            # 移除窗口外的元素
            if window and window[0] < i - k + 1:
                window.popleft()

            # 保持窗口内的元素递减
            while window and nums[window[-1]] < nums[i]:
                window.pop()

            # 将当前元素的索引加入窗口
            window.append(i)

            # 当窗口达到指定大小时，记录当前窗口的最大值
            if i >= k - 1:
                result.append(nums[window[0]])

        return result


if __name__ == '__main__':
    a = Solution()
    a.maxSlidingWindow([1, 3, -1, -3, 5, 3, 6, 7], 3)